package com.itheima.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.domain.EmpQueryParam;
import com.itheima.domain.PageResult;
import com.itheima.domain.pojo.Emp;
import com.itheima.domain.pojo.EmpExpr;
import com.itheima.domain.pojo.EmpLog;
import com.itheima.domain.pojo.LoginInfo;
import com.itheima.mapper.EmpExprMapper;
import com.itheima.mapper.EmpMapper;
import com.itheima.service.EmpLogService;
import com.itheima.service.EmpService;
import com.itheima.utils.JwtUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class EmpServiceImpl implements EmpService {
    private static final Logger log = LoggerFactory.getLogger(EmpServiceImpl.class);
    @Autowired
    private EmpMapper empMapper;
    @Autowired
    private EmpExprMapper empExprMapper;
    @Autowired
    private EmpLogService empLogService;

//=============================分页查询
    @Override
    //分页查询：通过PageHelper进行查询
    public PageResult<Emp> page(EmpQueryParam empQueryParam) {
            //1.获取分页参数
            PageHelper.startPage(empQueryParam.getPage(),empQueryParam.getPageSize());
            //2.调用方法
            List<Emp>empList= empMapper.list(empQueryParam);
            Page<Emp>p=(Page<Emp>) empList;
            //3.封装PageResult对象并返回
            return new PageResult(p.getTotal(),p.getResult());
        }


//===================保存员工
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void save(Emp emp)  {
        //1．保存员工的基本信息
        //1.1 补全基本信息
        try {
            emp.setCreateTime(LocalDateTime.now());
            emp.setUpdateTime(LocalDateTime.now());
            //1.2 新增
            empMapper.insert(emp);
            log.info("保存员工信息：{}",emp);
            //2.批量保存员工的工作经历信息
            //2.1封装员工id
            List<EmpExpr>exprList=emp.getExprList();
            if (exprList!=null&&!exprList.isEmpty()){
                exprList.forEach(empExpr -> empExpr.setEmpId(emp.getId()));
            }
            //2.2 批量保存
            empExprMapper.insertBatch(exprList);
        }finally {
            EmpLog empLog=new EmpLog(null,LocalDateTime.now(),"保存员工信息："+emp.toString());
            empLogService.insertLog(empLog);

        }
        }


        //=====================批量删除员工
    @Override
    @Transactional
    public void delete(List<Integer> ids) {
        //批量删除员工基本信息
        empMapper.delete(ids);
        //批量删除员工工作经历信息
        empExprMapper.delete2(ids);
    }
//======================修改员工的信息
    @Override
    public Emp get(Integer id) {
        //数据回显
        return empMapper.get(id);


    }

    @Override
    public void update(Emp emp) {
        //1.修改员工的基本信息
        emp.setUpdateTime(LocalDateTime.now());
        empMapper.updateById(emp);
        //2.删除员工工作经历信息方便添加
        Integer empId=emp.getId();
        empExprMapper.delete2(Arrays.asList(empId));
        //3.批量添加员工工作经历信息
        List<EmpExpr>exprList=emp.getExprList();
        if (exprList!=null&&!exprList.isEmpty()){
            exprList.forEach(empExpr -> empExpr.setEmpId(emp.getId()));
            //2.2 批量保存
            empExprMapper.insertBatch(exprList);
        }
    }



    @Override
    public List<Emp> lists() {
        return empMapper.lists();
    }



    @Override
    public LoginInfo login(Map<String, Object> logInfoMap) {
        String username =(String) logInfoMap.get("username");
        String password =(String) logInfoMap.get("password");
        log.info("员工来登录啦 , {}", logInfoMap);
        //1.根据用户名和密码查询员工
        Emp emp=empMapper.selectByUsernameAndPassword(username,password);
        //2.判断登录失败
        if (emp==null){
           return null;
        }
        //生成token
        Map<String,Object> claims=new HashMap<>();
        claims.put("id",emp.getId());
        claims.put("password",emp.getUsername());
         JwtUtils.generateJwt(claims);

         String token=JwtUtils.generateJwt(claims);
        return new LoginInfo(emp.getId(),emp.getUsername(),emp.getName(),  token) ;
    }
}
//传统查询
//    @Override
//    public PageResult<Emp> page(Integer page, Integer pageSize) {
//        //1.获取总记录数
//        Long total=empMapper.count();
//        //2.获取分页数据
//        Integer start=(page-1)*pageSize;
//      List<Emp>empList= empMapper.list(start,pageSize);
//        //3.封装PageResult对象并返回
//        return new PageResult<>(total,empList);

//    @Override
//    public PageResult<Emp> page(Integer page, Integer pageSize) {
//        //1.获取分页参数
//        PageHelper.startPage(page,pageSize);
//
//        //2.调用方法
//        List<Emp>empList= empMapper.list();
//        Page<Emp>p=(Page<Emp>) empList;
//
//        //3.封装PageResult对象并返回
//        return new PageResult(p.getTotal(),p.getResult());
//    }

